/**
*FileContentManager is a Java based file manager desktop application, 
*it can show, edit and manipulate the content of the files archived inside a zip.
*
*Copyright (C) 2007 
*
*Created by Camila Sanchez [http://mimix.wordpress.com/], Rafael Naufal [http://rnaufal.livejournal.com] and Rodrigo [rdomartins@gmail.com]
*
*FileContentManager is free software; you can redistribute it and/or
*modify it under the terms of the GNU Lesser General Public
*License as published by the Free Software Foundation; either
*version 2.1 of the License, or (at your option) any later version.
*
*This library is distributed in the hope that it will be useful,
*but WITHOUT ANY WARRANTY; without even the implied warranty of
*MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
*Lesser General Public License for more details.
*
*You should have received a copy of the GNU Lesser General Public
*License along with FileContentManager; if not, write to the Free Software
*Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package br.com.jteam.jfcm.main;

import java.util.Locale;

import javax.swing.SwingUtilities;
import javax.swing.UIManager;

import br.com.jteam.jfcm.controller.event.UpdateFileHistoryEvent;
import br.com.jteam.jfcm.controller.EventDispatchService;
import br.com.jteam.jfcm.gui.FCVGUIBuilder;
import br.com.jteam.jfcm.gui.FCVGUIManagerTemplate;
import br.com.jteam.jfcm.gui.GUIManagerTemplate;
import br.com.jteam.jfcm.gui.adapter.FileListPresentationContentAdapter;
import br.com.jteam.jfcm.gui.adapter.FileListPresentationContentAdapterImpl;
import br.com.jteam.jfcm.model.services.FileHistoryService;
import br.com.jteam.jfcm.model.services.FileListContentService;
import br.com.jteam.jfcm.model.services.impl.FileHistoryServiceImpl;
import br.com.jteam.jfcm.model.services.impl.FileListContentServiceImpl;

/**
 * 
 * Classe principal da aplica&ccedil;&atilde;o.
 * 
 */
public class Main
{

	/**
	 * Altera o {@link Locale} padr&atilde;o para "pt" e "BR".
	 * 
	 */
	private static void changeLocale()
	{
		Locale.setDefault(new Locale("en", "US"));
	}

	/**
	 * 
	 * Altera o look and feel da aplica&ccedil;&atilde;o para o padr&atilde;o do
	 * sistema operacional.
	 * 
	 */
	private static void changeLookAndFeel() throws Exception
	{
		UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
	}

	/**
	 * Cria e exibe a interface gr&aacute;fica.
	 * 
	 * @see br.ita.poo.fcv.view.FCVViewerTemplate
	 */
	private static void createAndShowGUI()
	{
		FileHistoryService listService = new FileHistoryServiceImpl();
		FileListContentService contentService =
						new FileListContentServiceImpl(listService);
		FileListPresentationContentAdapter adapter =
						new FileListPresentationContentAdapterImpl(contentService);
		FCVGUIBuilder builder = new FCVGUIBuilder(adapter);
		GUIManagerTemplate manager = new FCVGUIManagerTemplate(builder);
		EventDispatchService.getInstance()
							.subscribe(UpdateFileHistoryEvent.class, builder);
		manager.create();
		manager.show();
	}

	/**
	 * @return Um Runnable utilizado para criar uma Thread e descincronizar o
	 *         processo de cria&ccedil;&atilde;o da interface gr&aacute;fica.
	 */
	private static Runnable createJob()
	{
		return new Runnable()
		{
			public void run()
			{
				createAndShowGUI();
			}
		};
	}

	public static void main(String[] args) throws Throwable
	{
		changeLookAndFeel();
		changeLocale();
		scheduleGUICreation();
	}

	/**
	 * Delega &agrave; Event Dispatch Thread do Swing o agendamento da
	 * cria&ccedil;&atilde;o da interface gr&aacute;fica da
	 * aplica&ccedil;&atilde;o.
	 * 
	 * @see #createJob()
	 */
	private static void scheduleGUICreation()
	{
		SwingUtilities.invokeLater(createJob());
	}

}
